gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringdows/ringsizebar.cpp

    /**********************************************************************
//
//
//        ##########                          ######  #########   # ######    #
//      #############                      ########### ######### #########  ###
//     ######## # ###  ##                 ############# ##    ## #####  # ####
//     ####  ##    ## ###                 ###     ### # #      #####   #####
//          #     ###  #            #     ##       ##  ##      ##     ###
//         ## ###### ##      ##  ####    ####          #       #     ##
//       #########  ###  ## ### #######   ######      ##      ##    ###
//      ######      ##  ######  ##  ##       ####     #      ##     ####
//     #######     ##   ###### ##  ###          ##   ##     ###    ######
//     #########   ##  ###### ## ######         ### ##    ###      #  #####
//    ##    ###### ####### ### #### ##  ## #######  ########      ##    ####
//    ##      #### ###  #  ### ### ##  ##########   ######       ##      ####
//   ##         ##                ##   #########    ####         #         ##
//               #              ###
//                              ##
//                             ###
//                             ##
//
//
//							临风程序界面类库 ringdows.lib
//作者:临风
//
//版本:0.2
//
//声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:ringphone@sina.com
//
//原文件名:ringsize.cpp
//
//本文件说明:工具条窗口实现代码,该工具条窗口只是一个容器,
//					可调整尺寸
//
**********************************************************************/

#define MAKE_SELF_LIB
#include "ringdows.h"

#define RSMAXMIN_ZOOMUP		12
#define RSMAXMIN_ZOOMDOWN	24
#define RSMAXMIN_ZOOMLEFT	36
#define RSMAXMIN_ZOOMRIGHT	48

RingSizeBar::RingSizeBar()
{
	m_vfont = NULL;
	m_CurWhere = HTCLIENT;
	SetRectEmpty(&m_rcAllLine);
	SetRectEmpty(m_rcSpliter);
	SetRectEmpty(m_rcSpliter+1);
	m_nZoom = SW_RESTORE;
	m_font = (HFONT)GetStockObject(DEFAULT_GUI_FONT);
}

RingSizeBar::~RingSizeBar()
{
	if(m_vfont)
		DeleteObject(m_vfont);
}

//初始化停靠窗口尺寸
void RingSizeBar::InitDockSize()
{
	if(m_child && m_pSite)
	{
		RECT rc;
		GetWindowRect(m_child->Handle(),&rc);
		OffsetRect(&rc,-rc.left,-rc.top);

		//记录浮动尺寸
		CopyRect(&m_frc,&rc);

		if(m_pSite->IsVert())
			m_nSize = rc.right + m_BorderSpace*2;
		else
			m_nSize = rc.bottom + m_BorderSpace*2;

		//GetMaxClientRect(&rc);
		//m_child->SetPos(0,0,rc.right,rc.bottom,NULL,SWP_NOMOVE);
		UpdateSize();
	}
}

void RingSizeBar::OnDockStateChange(int stateOld,int stateNew)
{
	//默认处理
	if(stateOld != TBS_FLAG_NONE)
	{
		int w,h;
		if(::IsVert(stateNew))
		{
			w = m_vrc.right - m_vrc.left - m_BorderSpace*2;
			if(w <= 0)
				w = m_rcClient.bottom - m_rcClient.top;
			h = m_rcDockPos.bottom - m_rcDockPos.top;
		}
		else if(::IsHorz(stateNew))
		{
			w = m_rcDockPos.right - m_rcDockPos.left;
			h = m_hrc.bottom - m_hrc.top - m_BorderSpace*2;
			if(h <= 0)
				h = m_rcClient.right - m_rcClient.left;
		}
		else
		{
			w = m_frc.right - m_frc.left;;
			h = m_frc.bottom - m_frc.top;;
		}
		m_child->SetPos(0,0,w,h,0,SWP_NOMOVE);
	}
}

//得到指定停靠位置的客户坐标
BOOL RingSizeBar::GetClientRect(int state,LPRECT lprc)
{
	if(m_child && lprc)
	{
		LONG x = 0;
		//先向父窗口查询
		NMHDR hdr;
		hdr.hwndFrom = m_child->Handle();
		hdr.code = state;
		hdr.idFrom = (UINT)m_child;
		
		if(m_pSite)
			x = SendMessage(m_pSite->Parent()->Handle(),WM_GETDRAGRECTS,
									(WPARAM)lprc,(LPARAM)&hdr);
		else if(m_flyBar)
			x = SendMessage(m_flyBar->Parent()->Handle(),WM_GETDRAGRECTS,
									(WPARAM)lprc,(LPARAM)&hdr);
		//查询失败,向控件查询
		if(x == 0)
			x = SendMessage(m_child->Handle(),WM_GETDRAGRECTS,(WPARAM)lprc,(LPARAM)&hdr);
		//再失败,获取控件尺寸处理
		if(x == 0)
		{
			if(state == TBS_FLAG_FLY)
			{
				//浮动尺寸由InitDokSize初始化,复制
				CopyRect(lprc,&m_frc);
			}
			else
			{
				GetWindowRect(m_child->Handle(),lprc);
				if((state == TBS_FLAG_VERT && !IsVert()) || 
					(state == TBS_FLAG_HORZ && IsVert()))
				{
					//横竖状态改变,矩形宽高调换
					x = lprc->bottom;
					lprc->bottom = lprc->right;
					lprc->right = x;
					x = lprc->left;
					lprc->left = lprc->top;
					lprc->top = x;
				}
			}
		}
		return TRUE;
	}
	else
		return FALSE;
}

int RingSizeBar::GetPreSpace()
{
	int m,n;
	
	if(IsVert())
	{
		m = m_rcClient.bottom - m_rcClient.top;
		n = m_GripperSpace + ((RING_SPLITERSIZE + m_BorderSpace) << 1);
	}
	else
	{			
		m = m_rcClient.right - m_rcClient.left;
		n = m_GripperSpace + ((RING_SPLITERSIZE + m_BorderSpace) << 1);
	}

	//UpdateCaption(0);
	
	return IsVisible()?max(0,(m - n)):m;
}

void RingSizeBar::UpdateFlySize(int nWidth,int nHeight)
{
	RingDockBar::UpdateFlySize(nWidth,nHeight);
	if(m_child)
		MoveWindow(m_child->Handle(),0,0,nWidth - WINVAR_FRAME_X*2,
						nHeight - BARTOOLY - WINVAR_FRAME_Y,TRUE);
}

/*
LRESULT RingSizeBar::OnSizing(RINGPARAMS& param)
{	
	//if(m_child)
	//	SendMessage(m_child->Handle(),param.uMsg,param.wParam,param.lParam);
	return TRUE;
}
*/

/***************************************************************************
//
//调整停靠位置,nEdge为右边界,nPreSpace为前面可移动空间,工具栏
//超过右边界,应往前移,但移动距离不可超过可移动空间。
//本函数假设所有工具栏都不重叠
//
***************************************************************************/
HDWP RingSizeBar::AdjustDockPosH(HDWP hdwp,int nEdge,int nPreSpace,BOOL bCanWrap)
{
	int nPrevLen=0,offset = 0;
	int nMinSize = m_GripperSpace + ((RING_SPLITERSIZE + m_BorderSpace) << 1);

	if(m_child && m_pSite && m_bVisible)
	{
		if(nPreSpace < 0)
		{
			m_rcDockPos.left -= nPreSpace;
			m_rcClient.left -= nPreSpace;
			nPreSpace = 0;
		}
		if(m_rcDockPos.right > nEdge && m_rcDockPos.right - m_rcDockPos.left <= nMinSize)
		{
			nPrevLen = m_rcDockPos.right - nEdge;
			nPrevLen = min(nPrevLen,nPreSpace);
			OffsetDockPos(-nPrevLen,0);
		}
		else
		{
			if(m_nZoom == SW_MINIMIZE)// || (HIWORD(m_nZoom) == 1 && nPreSpace - nPrevLen==0))
				OffsetDockPos(nEdge - m_rcDockPos.right,0);
			else
			{
				nPrevLen = m_rcDockPos.right - nEdge;
				//nPrevLen如果为负,不能把后面空间算在nPreSpace里面
				nPrevLen = max(0,min(nPrevLen,nPreSpace));
				m_rcDockPos.right = nEdge;
				
				if(m_rcDockPos.right - m_rcDockPos.left < nMinSize)
				{
					if(nPreSpace - nPrevLen > 0)
					{
						m_rcDockPos.left = nEdge - (nMinSize + (nPreSpace - nPrevLen)/m_lineInfo->m_nSizeBarCnt);
						m_rcClient.left = m_rcDockPos.left + m_GripperSpace;
					}
					else
						m_rcDockPos.right = m_rcDockPos.left + nMinSize;					
				}
				m_rcClient.right = m_rcDockPos.right - m_BorderSpace;
			}
		}
		
		offset = m_lineInfo->m_maxSize - m_nSize;// - RING_SPLITERSIZE - m_nSize;
		m_nSize += offset;
		m_rcClient.bottom += offset;
		m_rcDockPos.bottom += offset;
		
		UpdateCaption();
		
		//调整尺寸后不刷新,在DockSite的WM_ERASEBKGND消息调用Draw时刷新
		hdwp = m_child->DefDeferWindowPos(hdwp,m_rcClient.left,m_rcClient.top,
			m_rcClient.right - m_rcClient.left,m_rcClient.bottom - m_rcClient.top);

		if(m_nZoom == SW_RESTORE)
			m_nRestoreSize = m_rcClient.right - m_rcClient.left;
		if(m_prev && hdwp)
		{
			//if(offset < 0)
			//	offset = m_prev->m_winpos.right - m_winpos.x;
			nPreSpace -= nPrevLen;//min(offset,m_winpos.x - m_prev->m_winpos.right);
			m_prev->AdjustDockPosH(hdwp,m_rcDockPos.left,nPreSpace,bCanWrap);
		}
		//else
		//	m_pSite->WrapBar(m_lineInfo,NULL,FALSE);
	}
	return hdwp;
}

/***************************************************************************
//
//调整停靠位置,nEdge为下边界,nPreSpace为上面可移动空间,工具栏
//超过下边界,应往上移,但移动距离不可超过可移动空间。
//本函数假设所有工具栏都不重叠
//
***************************************************************************/
HDWP RingSizeBar::AdjustDockPosV(HDWP hdwp,int nEdge,int nPreSpace,BOOL bCanWrap)
{
	int nPrevLen,offset = 0;
	int nMinSize = m_GripperSpace + ((RING_SPLITERSIZE + m_BorderSpace) << 1);

	if(m_child && m_pSite && m_bVisible)
	{
		if(nPreSpace < 0)
		{
			m_rcDockPos.top -= nPreSpace;
			m_rcClient.top -= nPreSpace;
			nPreSpace = 0;
		}
		if(m_rcDockPos.bottom > nEdge && m_rcDockPos.bottom - m_rcDockPos.top <= nMinSize)
		{
			nPrevLen = m_rcDockPos.bottom - nEdge;
			nPrevLen = min(nPrevLen,nPreSpace);
			OffsetDockPos(0,-nPrevLen);
		}
		else
		{
			if(m_nZoom == SW_MINIMIZE)// || (HIWORD(m_nZoom) == 1 && nPreSpace - nPrevLen==0))
				OffsetDockPos(0,nEdge - m_rcDockPos.bottom);
			else
			{
				nPrevLen = m_rcDockPos.bottom - nEdge;
				//nPrevLen如果为负,不能把后面空间算在nPreSpace里面
				nPrevLen = max(0,min(nPrevLen,nPreSpace));
				m_rcDockPos.bottom = nEdge;
				
				if(m_rcDockPos.bottom - m_rcDockPos.top < nMinSize)
				{
					if(nPreSpace - nPrevLen > 0)
					{
						m_rcDockPos.top = nEdge - (nMinSize + (nPreSpace - nPrevLen)/m_lineInfo->m_nSizeBarCnt);
						m_rcClient.top = m_rcDockPos.top + m_GripperSpace;
					}
					else
						m_rcDockPos.bottom = m_rcDockPos.top + nMinSize;					
				}
				m_rcClient.bottom = m_rcDockPos.bottom - m_BorderSpace;
			}
		}
		/*原有代码
		if(m_prev)
			nPrevLen = m_winpos.y - m_prev->m_winpos.bottom;

		if(m_winpos.bottom > nEdge)
		{
			offset = m_winpos.bottom - nEdge;
			m_winpos.bottom = nEdge;
			m_winpos.cy -= offset;
			m_rcClient.bottom -= offset;
		}
		else if(nPreSpace < 0)
		{
			offset = -nPreSpace;
			m_winpos.bottom += offset;
			m_rcClient.bottom += offset;
			m_winpos.cy += offset;			
		}
		*/
		offset = m_lineInfo->m_maxSize - m_nSize;// - RING_SPLITERSIZE - m_nSize;
		m_nSize += offset;
		m_rcClient.right += offset;
		m_rcDockPos.right += offset;

		UpdateCaption();
		//if(m_winpos.x > nEdge && bCanWrap)
		//	m_pSite->WrapBar(m_lineInfo,this,(m_next == NULL));
		//else
		hdwp = m_child->DefDeferWindowPos(hdwp,m_rcClient.left,m_rcClient.top,
							m_rcClient.right - m_rcClient.left,m_rcClient.bottom - m_rcClient.top);

		if(m_nZoom == SW_RESTORE)
			m_nRestoreSize = m_rcClient.right - m_rcClient.left;
		if(m_prev && hdwp)
		{
			//if(offset < 0)
			//	offset = m_prev->m_winpos.right - m_winpos.x;
			nPreSpace -= nPrevLen;//min(offset,m_winpos.x - m_prev->m_winpos.right);
			m_prev->AdjustDockPosV(hdwp,m_rcDockPos.top,nPreSpace,bCanWrap);
		}
		//else
		//	m_pSite->WrapBar(m_lineInfo,NULL,FALSE);
	}
	return hdwp;
}

//计算子窗口尺寸
BOOL RingSizeBar::AdjustChildH(int nAddSpace)
{
	if(m_child && m_pSite && m_bVisible)
	{
		int nStep = 0;
		RECT rc;
		GetWindowRect(m_child->Handle(),&rc);
		OffsetRect(&rc,-rc.left,-rc.top);

		if(m_lineInfo)
		{
			//纵向尺寸
			m_rcDockPos.top = m_lineInfo->m_pos;
			m_nSize = rc.bottom + m_BorderSpace*2;
			
			if(m_prev == NULL || !m_prev->IsVisible())
				m_rcDockPos.left = 0;
			else
				m_rcDockPos.left = m_prev->m_rcDockPos.right;

			//当HIWORD(m_nZoom)==1时表示由最大化变为正常,此时尺寸由最大化尺寸变为
			//正常尺寸,与后面的停靠栏有空挡,不能扩展尺寸变回去
			if(m_nZoom != SW_MINIMIZE && HIWORD(m_nZoom) == 0)
			{
				if(m_next == NULL)
					rc.right = m_pSite->m_rcPos.right - m_pSite->m_rcPos.left - m_GripperSpace - m_BorderSpace*2 + nAddSpace - m_rcDockPos.left;
				else
					rc.right = m_next->m_rcDockPos.left - m_GripperSpace - m_BorderSpace*2 + nAddSpace - m_rcDockPos.left;
			}
			else
				m_nZoom &= 0x0000FFFF;

			//客户区尺寸
			OffsetRect(&rc,m_rcDockPos.left + m_BorderSpace + m_GripperSpace,
				m_rcDockPos.top + m_BorderSpace);
			CopyRect(&m_rcClient,&rc);

			int w = m_rcClient.right - m_rcClient.left;
			int h = RING_SPLITERSIZE * 2;
			h = max(w,h);
			m_rcClient.right = m_rcClient.left + h;
						
			m_rcDockPos.right = m_rcClient.right + m_BorderSpace;
			m_rcDockPos.bottom = m_rcClient.bottom + m_BorderSpace;			
		}
		return TRUE;
	}
	return FALSE;
}

BOOL RingSizeBar::AdjustChildV(int nAddSpace)
{
	if(m_child && m_pSite && m_bVisible)
	{
		int nStep = 0;
		RECT rc;
		GetWindowRect(m_child->Handle(),&rc);
		OffsetRect(&rc,-rc.left,-rc.top);
/*
		if(m_prev == NULL && m_next == NULL)
		{
			m_winpos.y = 0;
			rc.bottom = m_pSite->m_winpos.cy - m_GripperSpace - m_BorderSpace*2;
		}
*/		
		if(m_lineInfo)
		{
			//横向尺寸
			m_rcDockPos.left = m_lineInfo->m_pos;
			m_nSize = rc.right + m_BorderSpace*2;
			
			if(m_prev == NULL || !m_prev->IsVisible())
				m_rcDockPos.top = 0;
			else
				m_rcDockPos.top = m_prev->m_rcDockPos.bottom;

			//当HIWORD(m_nZoom)==1时表示由最大化变为正常,此时尺寸由最大化尺寸变为
			//正常尺寸,与后面的停靠栏有空挡,不能扩展尺寸变回去
			if(m_nZoom != SW_MINIMIZE && HIWORD(m_nZoom) == 0)
			{
				if(m_next == NULL)
					rc.bottom = m_pSite->m_rcPos.bottom - m_pSite->m_rcPos.top - m_GripperSpace - m_BorderSpace*2 + nAddSpace - m_rcDockPos.top;
				else
					rc.bottom = m_next->m_rcDockPos.top - m_GripperSpace - m_BorderSpace*2 + nAddSpace - m_rcDockPos.top;
			}
			else
				m_nZoom &= 0x0000FFFF;
			
			//客户区尺寸
			OffsetRect(&rc,m_rcDockPos.left + m_BorderSpace,
					m_rcDockPos.top + m_BorderSpace + m_GripperSpace);
			CopyRect(&m_rcClient,&rc);

			int w = m_rcClient.bottom - m_rcClient.top;
			int h = RING_SPLITERSIZE * 2;//m_GripperSpace + ((RING_SPLITERSIZE + m_BorderSpace) << 1);
			h = max(w,h);			
			m_rcClient.bottom = m_rcClient.top + h;
						
			m_rcDockPos.right = m_rcClient.right + m_BorderSpace;
			m_rcDockPos.bottom = m_rcClient.bottom + m_BorderSpace;
			//if(m_nZoom == SW_RESTORE)
			//	m_nRestoreSize = m_rcClient.right - m_rcClient.left;
		}
		return TRUE;
	}
	return FALSE;
}

void RingSizeBar::DrawGripper(HDC hDC)
{
	if(m_uStyle == TBS_EX_NONE)
		return;

	RECT rc;
	CopyRect(&rc,(LPRECT)&m_rcDockPos);
	InflateRect(&rc,-1,-2);
	int x=0,y=0;
	UINT step = 3,flag = 0;

	if(IsVert())
	{
		rc.bottom = rc.top + 3;
		OffsetRect(&rc,0,1);

		if(m_uStyle & TBS_EX_CANCLOSE)
		{
			//绘制关闭按钮
			DrawFrameControl(hDC,&m_rcClose,DFC_CAPTION,DFCS_CAPTIONCLOSE);
			rc.right -= 17;
			OffsetRect(&rc,0,step);
			rc.left += step;
			step = 0;
		}
		if((m_uStyle & TBS_EX_DOCKABLE))
		{
			if(m_uStyle & TBS_EX_CANCLOSE)
			{
				//可拖动,绘制最小/大化按钮,必须已绘制关闭按钮才绘制
				if(m_lineInfo && m_lineInfo->m_nSizeBarCnt == 1)
					flag = DFCS_INACTIVE;
				
				if(m_nZoom != SW_MAXIMIZE)
					DrawFrameControl(hDC,&m_rcMinMax,DFC_SCROLL,DFCS_SCROLLUP|flag);
				else
					DrawFrameControl(hDC,&m_rcMinMax,DFC_SCROLL,DFCS_SCROLLDOWN|flag);

				rc.right -= 15;
				OffsetRect(&rc,0,step);
				rc.left += step;
			}			

			//绘制把手
			DrawEdge(hDC,&rc,BDR_RAISEDINNER,BF_RECT);
			OffsetRect(&rc,0,4);
			DrawEdge(hDC,&rc,BDR_RAISEDINNER,BF_RECT);
		}
		else
		{
			//绘制文字
			rc.top -= 3;
			rc.bottom += 7;
			SelectObject(hDC,m_font);
			DrawText(hDC,m_szTitle,strlen(m_szTitle),&rc,DT_LEFT|DT_VCENTER|DT_SINGLELINE);
		}
	}
	else
	{
		rc.right = rc.left + 3;
		OffsetRect(&rc,1,0);

		if(m_uStyle & TBS_EX_CANCLOSE)
		{
			DrawFrameControl(hDC,&m_rcClose,DFC_CAPTION,DFCS_CAPTIONCLOSE);
			rc.top += 17;
			OffsetRect(&rc,step,0);
			rc.bottom -= step;
			step = 0;
		}
		if((m_uStyle & TBS_EX_DOCKABLE))
		{
			if(m_uStyle & TBS_EX_CANCLOSE)
			{
				if(m_lineInfo && m_lineInfo->m_nSizeBarCnt == 1)
					flag = DFCS_INACTIVE;
			
				if(m_nZoom != SW_MAXIMIZE)
					DrawFrameControl(hDC,&m_rcMinMax,DFC_SCROLL,DFCS_SCROLLLEFT|flag);
				else
					DrawFrameControl(hDC,&m_rcMinMax,DFC_SCROLL,DFCS_SCROLLRIGHT|flag);

				rc.top += 15;
				OffsetRect(&rc,step,0);
				rc.bottom -= step;
			}

			DrawEdge(hDC,&rc,BDR_RAISEDINNER,BF_RECT);
			OffsetRect(&rc,4,0);
			DrawEdge(hDC,&rc,BDR_RAISEDINNER,BF_RECT);
		}
		else
		{
			//绘制文字
			rc.left -= 3;
			rc.right += 7;
			SelectObject(hDC,m_vfont);
			SetBkMode(hDC,TRANSPARENT);
			TextOut(hDC,rc.left,rc.bottom,m_szTitle,strlen(m_szTitle));			
		}
	}
	if(m_rcSpliter->right != 0)
	{
		DrawEdge(hDC,m_rcSpliter,BDR_RAISEDINNER,BF_RECT);
		DrawEdge(hDC,m_rcSpliter,BDR_RAISEDOUTER,BF_BOTTOMRIGHT);
	}
	if(m_rcSpliter[1].right != 0)
	{
		DrawEdge(hDC,m_rcSpliter+1,BDR_RAISEDINNER,BF_RECT);
		DrawEdge(hDC,m_rcSpliter+1,BDR_RAISEDOUTER,BF_BOTTOMRIGHT);
	}
}

void RingSizeBar::UpdateCaption()
{
	//更新关闭按钮位置
	RingDockBar::UpdateCaption();
	//更新最小/大化按钮位置
	if(IsVert())
	{
		if((m_uStyle & TBS_EX_DOCKABLE) || (m_uStyle & TBS_EX_CANCLOSE))
		{
			//可拖动,不管有无关闭按钮,总有最小/大化按钮
			if((m_uStyle & TBS_EX_CANCLOSE))
			{
				CopyRect(&m_rcMinMax,&m_rcClose);
				OffsetRect(&m_rcMinMax,-14,0);
			}
			else
			{
				m_rcMinMax.left = m_rcDockPos.right - m_rcDockPos.left - 15;
				m_rcMinMax.top = 3;
				m_rcMinMax.right = m_rcDockPos.right - m_rcDockPos.left - 3;
				m_rcMinMax.bottom = 15;
			}

			m_rcCaption.left = 0;
			m_rcCaption.top = 0;
			m_rcCaption.right = m_rcDockPos.right - m_rcDockPos.left;
			m_rcCaption.bottom = 18;
		}
	}
	else
	{
		if((m_uStyle & TBS_EX_DOCKABLE))
		{
			if((m_uStyle & TBS_EX_CANCLOSE))
			{
				CopyRect(&m_rcMinMax,&m_rcClose);
				OffsetRect(&m_rcMinMax,0,14);
			}
			else
			{
				m_rcMinMax.left = 3;
				m_rcMinMax.top = 3;
				m_rcMinMax.right = 15;
				m_rcMinMax.bottom = 15;
			}
			
			m_rcCaption.left = 0;
			m_rcCaption.top = 0;
			m_rcCaption.right = 18;
			m_rcCaption.bottom = m_rcDockPos.bottom - m_rcDockPos.top;
		}
		else
		{
			//不可拖动,检测有无关闭按钮
			if((m_uStyle & TBS_EX_CANCLOSE) && m_vfont == NULL)
			{
				//创建竖向字体
				LOGFONT lf;
				if(GetObject(m_font,sizeof(LOGFONT),&lf))
				{
					lf.lfEscapement = 900;
					m_vfont = CreateFontIndirect(&lf);
				}
				m_rcCaption.left = 0;
				m_rcCaption.top = 0;
				m_rcCaption.right = 18;
				m_rcCaption.bottom = m_rcDockPos.bottom - m_rcDockPos.top;
			}
		}
	}
}

int RingSizeBar::SetDragRect(HWND hWnd,RingDragger* dragger)
{
	if(m_currState ==  TBS_FLAG_FLY)
	{
		dragger->SetDragRect(&m_frc,hWnd);
		return 3;
	}
	else
	{
		RECT rcClient,rcWindow;
		int m;
		m_child->Parent()->GetClientRect(&rcClient);
		MapWindowPoints(m_child->Parent()->Handle(),hWnd,(LPPOINT)&rcClient,2);
		::GetClientRect(m_child->Parent()->Handle(),&rcWindow);
		MapWindowPoints(m_child->Parent()->Handle(),hWnd,(LPPOINT)&rcWindow,2);

		if(::IsVert(m_currState))
		{
			m = (m_vrc.right + m_vrc.left)/2;	//求中线位置
			if((m > rcClient.right && m < rcWindow.right) || 
				(m < rcClient.left && m > rcWindow.left))
			{
				if(m_currState == m_State)
					dragger->SetDragRect(&m_vrc,hWnd);
				else
					dragger->SetDragRect(&m_frc,hWnd);
			}
			else
			{
				//设置整行矩形
				m_rcAllLine.top = rcClient.top;
				m_rcAllLine.bottom =  rcClient.bottom;
				m_rcAllLine.left = m_vrc.left;
				m_rcAllLine.right = m_vrc.right;
				dragger->SetDragRect(&m_rcAllLine,hWnd);
			}
		}
		else
		{
			m = (m_hrc.bottom + m_hrc.top)/2;	//求中线位置
			if((m > rcClient.bottom && m < rcWindow.bottom) || 
				(m < rcClient.top && m > rcWindow.top))
			{
				if(m_currState == m_State)
					dragger->SetDragRect(&m_hrc,hWnd);
				else
					dragger->SetDragRect(&m_frc,hWnd);
			}
			else
			{
				//设置整行矩形
				m_rcAllLine.left = rcWindow.left;
				m_rcAllLine.right =  rcWindow.right;
				m_rcAllLine.top = m_hrc.top;
				m_rcAllLine.bottom = m_hrc.bottom;
				dragger->SetDragRect(&m_rcAllLine,hWnd);
			}
		}
	}
	return 1;
}

void RingSizeBar::Show(int nState)
{
	if(nState == SW_SHOW || nState == SW_HIDE)
	{
		if(m_State == TBS_FLAG_FLY && m_flyBar)
			m_flyBar->Show(nState);
		else
		{
			if(m_child)
				m_child->Show(nState);
			m_bVisible = (nState == SW_SHOW);
			if(m_lineInfo && m_bVisible)
				m_lineInfo->isVisible = TRUE;
			
			//标记一下,以后显示时根据m_nRestoreSize决定尺寸(同一行/列内有其他SizeBar的情况)
			m_nZoom |= 0x00010000;

			UpdateAllSite();
		}
	}
	else
	{
		m_nZoom = nState;
		if(m_child)
		{
			if(IsVert())
			{
				if(nState == SW_MINIMIZE)
					m_child->SetPos(m_rcClient.left,m_rcClient.top,
										m_rcClient.right - m_rcClient.left,0);
				else if(LOWORD(nState) == SW_RESTORE)
				{
					if(m_nRestoreSize > m_pSite->Height() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)
						m_nRestoreSize = (m_pSite->Height() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)/m_lineInfo->m_nSizeBarCnt;
					m_child->SetPos(m_rcClient.left,m_rcClient.top,
										m_rcClient.right - m_rcClient.left,m_nRestoreSize);
				}
			}
			else
			{
				if(nState == SW_MINIMIZE)
					m_child->SetPos(m_rcClient.left,m_rcClient.top,0,
										m_rcClient.bottom - m_rcClient.top);
				else if(LOWORD(nState) == SW_RESTORE)
				{
					if(m_nRestoreSize > m_pSite->Width() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)
						m_nRestoreSize = (m_pSite->Width() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)/m_lineInfo->m_nSizeBarCnt;
					m_child->SetPos(m_rcClient.left,m_rcClient.top,m_nRestoreSize,
										m_rcClient.bottom - m_rcClient.top);
				}
			}
		}
	}
}

//判断鼠标位于何方,本函数进入前已经过判断鼠标是在本DockBar范围内
UINT RingSizeBar::HitTest(POINT* lpt)
{
	if((m_uStyle & TBS_EX_CANCLOSE) && PtInRect(&m_rcClose,*lpt))
		return HTCLOSE;
	else if(PtInRect(&m_rcMinMax,*lpt))
	{
		if(m_lineInfo && m_lineInfo->m_nSizeBarCnt > 1)
			return HTZOOM;
		else
			return HTNOWHERE;
	}
	else
		return HTCAPTION;
}

void RingSizeBar::StartPushFrameControl(HWND hWnd,RingDragger* dragger,RINGPARAMS& param)
{
	if(m_CurWhere == HTZOOM)
	{
		HDC hDC = GetDC(hWnd);
		if(IsVert())
		{
			if(m_nZoom != SW_MAXIMIZE)
				m_bNCBtDown = DFCS_SCROLLUP|DFCS_PUSHED;
			else
				m_bNCBtDown = DFCS_SCROLLDOWN|DFCS_PUSHED;
		}
		else
		{
			if(m_nZoom != SW_MAXIMIZE)
				m_bNCBtDown = DFCS_SCROLLLEFT|DFCS_PUSHED;
			else
				m_bNCBtDown = DFCS_SCROLLRIGHT|DFCS_PUSHED;
		}
		DrawFrameControl(hDC,&m_rcMinMax,DFC_SCROLL,m_bNCBtDown);
		ReleaseDC(hWnd,hDC);
		SetCapture(hWnd);
	}
	else
		RingDockBar::StartPushFrameControl(hWnd,dragger,param);
}

void RingSizeBar::OnPushHoverFrameControl(HWND hWnd,RingDragger* dragger,LPPOINT lpt)
{
	if(m_CurWhere == HTZOOM)
	{
		HDC hDC = GetDC(hWnd);
		if(PtInRect(&m_rcMinMax,*lpt))
		{
			if((m_bNCBtDown & DFCS_PUSHED) != DFCS_PUSHED)
			{
				m_bNCBtDown |= DFCS_PUSHED;
				DrawFrameControl(hDC,&m_rcMinMax,DFC_SCROLL,m_bNCBtDown);
			}
		}
		else
		{
			if((m_bNCBtDown & DFCS_PUSHED) == DFCS_PUSHED)
			{
				m_bNCBtDown &= ~DFCS_PUSHED;
				DrawFrameControl(hDC,&m_rcMinMax,DFC_SCROLL,m_bNCBtDown);
			}
		}
		ReleaseDC(hWnd,hDC);
	}
	else
		RingDockBar::OnPushHoverFrameControl(hWnd,dragger,lpt);
}

void RingSizeBar::StopPushFrameControl(HWND hWnd,RingDragger* dragger,LPPOINT lpt)
{
	if(PtInRect(&m_rcMinMax,*lpt) && m_CurWhere == HTZOOM)
		OnMinMax();
	else
		RingDockBar::StopPushFrameControl(hWnd,dragger,lpt);
	
	if(m_pSite)
	{
		HDWP hdwp = BeginDeferWindowPos(10);
		if(IsVert())
			m_pSite->BarLineResizeV(hdwp,m_lineInfo,m_pSite->Height());
		else
			m_pSite->BarLineResizeH(hdwp,m_lineInfo,m_pSite->Width());
		EndDeferWindowPos(hdwp);
		InvalidateRect(m_pSite->Handle(),NULL,TRUE);
	}
}

void RingSizeBar::OnMinMax()
{
	int nState;
	if(m_nZoom == SW_MAXIMIZE)
	{
		//nState = SW_RESTORE;
		//Show(SW_RESTORE);
		if(m_child)
		{
			if(IsVert())
			{
				if(m_nRestoreSize > m_pSite->Height() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)
					m_nRestoreSize = (m_pSite->Height() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)/m_lineInfo->m_nSizeBarCnt;
				MoveWindow(m_child->Handle(),m_rcClient.left,m_rcClient.bottom-m_nRestoreSize,
								m_rcClient.right - m_rcClient.left,m_nRestoreSize,TRUE);
				//m_child->SetPos(m_rcClient.left,m_rcClient.bottom-m_nRestoreSize,
				//					m_rcClient.right - m_rcClient.left,m_nRestoreSize);
			}
			else
			{
				if(m_nRestoreSize > m_pSite->Width() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)
					m_nRestoreSize = (m_pSite->Width() - (m_GripperSpace + m_BorderSpace)*m_lineInfo->m_nSizeBarCnt)/m_lineInfo->m_nSizeBarCnt;
				MoveWindow(m_child->Handle(),m_rcClient.right-m_nRestoreSize,m_rcClient.top,
								m_nRestoreSize,m_rcClient.bottom - m_rcClient.top,TRUE);
				//m_child->SetPos(m_rcClient.right-m_nRestoreSize,m_rcClient.top,
				//					m_nRestoreSize,m_rcClient.bottom - m_rcClient.top);
			}
		}
		//标记由最大化变为正常,与后面的停靠栏有空挡,不能扩展尺寸变回去
		m_nZoom = nState = MAKELONG(SW_RESTORE,1);		
	}
	else
	{
		//最小化及正常状态,改变为最大化
		m_nZoom = SW_MAXIMIZE;
		nState = SW_MINIMIZE;
	}
	
	RingDockBar *dockbar = m_prev;
	while(dockbar)
	{
		dockbar->Show(nState);
		dockbar = dockbar->m_prev;
	}
	dockbar = m_next;
	while(dockbar)
	{
		dockbar->Show(nState);
		dockbar = dockbar->m_next;
	}	
}

//LRESULT RingSizeBar::OnNCPaint(RINGPARAMS param)
//{
/*	RECT rc;
		
	HDC hDC = GetWindowDC(m_hWnd);
	ExcludeClipRect(hDC,m_rcClient.left,m_rcClient.top,m_rcClient.right,m_rcClient.bottom);

/*	if(!DrawBkg(hDC))
	{
		GetWindowRect(m_hWnd,&rc);
		OffsetRect(&rc,-rc.left,-rc.top);
		FillRect(hDC,&rc,GetSysColorBrush(COLOR_BTNFACE));
	}
*/
/*	if(m_ExStyle != TBS_EX_NONE && m_State != TBS_FLAG_FLY)
	{
		HDC hMemDC = CreateCompatibleDC(hDC);
		SelectObject(hMemDC,m_hbmCtrl);

		//DrawFrameControl(hDC,&m_rcClose,DFC_CAPTION,DFCS_CAPTIONCLOSE|DFCS_FLAT|DFCS_TRANSPARENT);
		BitBlt(hMemDC,60,0,12,12,hDC,m_rcClose.left,m_rcClose.top,SRCCOPY);
		BitBlt(hDC,m_rcClose.left,m_rcClose.top,12,12,hMemDC,0,0,SRCAND);
		
		if(m_ExStyle == TBS_EX_SIZEABLE)
		{
			char title[40];
			memset(title,0,40);
			GetWindowText(m_hWnd,title,40);
			SetBkMode(hDC,TRANSPARENT);
			if(m_State > TBS_FLAG_DOCKBOTTOM)
			{
				SelectObject(hDC,m_font);
				TextOut(hDC,5,3,title,strlen(title));
			}	
			else
			{
				SelectObject(hDC,m_vfont);
				TextOut(hDC,3,m_winpos.cy - 5,title,strlen(title));
			}		
			DrawEdge(hDC,&m_rcCaption,BDR_RAISEDINNER,BF_RECT);
		}
		else
		{		
			BitBlt(hMemDC,72,0,12,12,hDC,m_rcMinMax.left,m_rcMinMax.top,SRCCOPY);
			BitBlt(hDC,m_rcMinMax.left,m_rcMinMax.top,12,12,hMemDC,m_nZoom,0,SRCAND);
			if(m_State > TBS_FLAG_DOCKBOTTOM)
			{			
				rc.left = 5;
				rc.top = 5;
				rc.right = m_winpos.cx - 35;
				rc.bottom = 8;
				DrawEdge(hDC,&rc,BDR_RAISEDINNER,BF_RECT);
				OffsetRect(&rc,0,5);
			}
			else
			{
				rc.left = 5;
				rc.top = 35;
				rc.right = 8;
				rc.bottom = m_winpos.cy - 3;
				DrawEdge(hDC,&rc,BDR_RAISEDINNER,BF_RECT);
				OffsetRect(&rc,5,0);
			}
			DrawEdge(hDC,&m_rcMinMax,BDR_RAISEDINNER,BF_RECT);
			DrawEdge(hDC,&rc,BDR_RAISEDINNER,BF_RECT);
			DrawEdge(hDC,&m_rcClose,BDR_RAISEDINNER,BF_RECT);
		}	
		
		CopyRect(&rc,(LPRECT)&m_winpos);
		OffsetRect(&rc,-rc.left,-rc.top);
		DrawEdge(hDC,&rc,BDR_SUNKENOUTER,BF_RECT);

		DeleteDC(hMemDC);
	}
	ReleaseDC(m_hWnd,hDC);
*/
//	return 1;	
//}

//LRESULT RingSizeBar::OnNCLButtonDown(RINGPARAMS param)
//{	
/*	LPRECT lprc;
	m_CurWhere = param.wParam;
	int x,x1;

	if(param.wParam == HTCLOSE)
	{
		lprc = &m_rcClose;
		x = 0;
		x1 = 60;
	}
	else if(param.wParam == HTZOOM)
	{
		lprc = &m_rcMinMax;
		x = m_nZoom;
		x1 = 72;
	}
	else
	{
		if(m_ExStyle == TBS_EX_DOCKABLE)
		{
			m_bNCBtDown = 2;
			POINT pt = {param.mousept.x,param.mousept.y};
			ScreenToClient(m_hWnd,&pt);
			RECT rc;
			CopyRect(&rc,(LPRECT)&m_winpos);
			OffsetRect(&rc,-m_winpos.x,-m_winpos.y);
			if(m_State > TBS_FLAG_DOCKBOTTOM)
			{
				OffsetRect(&rc,-3,-18);
				CopyRect(&m_vrc,&rc);
				m_hrc.left = 0;
				m_hrc.right = m_parent->Width();
				m_hrc.top = m_vrc.top;
				m_hrc.bottom = m_hrc.top + m_winpos.cx;
			}
			else
			{
				OffsetRect(&rc,-18,-3);
				CopyRect(&m_hrc,&rc);
				((RingWnd*)m_parent)->GetClientRect(&m_vrc);
				OffsetRect(&m_vrc,0,-m_vrc.top);
				m_vrc.left = m_hrc.left;
				m_vrc.right = m_vrc.left + m_winpos.cy;
			}			
			m_frc.bottom = m_hrc.top + m_winpos.fy;
			m_frc.left = m_hrc.left;
			m_frc.right = m_frc.left + m_winpos.fx;
			m_frc.top = m_hrc.top - BARTOOLY;
			
			//			InitFlyRect();
			m_currState = m_State;
			if(param.wParam == (WPARAM)m_flyBar)
				m_dragger.StartDrag(m_hWnd,pt.x,pt.y,&m_frc,3);
			else
				m_dragger.StartDrag(m_hWnd,pt.x,pt.y,&rc,1);			
		}
		return 0;
	}
	if(m_ExStyle != TBS_EX_NONE)
	{
		m_bNCBtDown = 2;

		HDC hDC = GetWindowDC(m_hWnd);

		HDC hMemDC = CreateCompatibleDC(hDC);
		SelectObject(hMemDC,m_hbmCtrl);

		BitBlt(hDC,lprc->left,lprc->top,12,12,hMemDC,x1,0,SRCCOPY);
		BitBlt(hDC,lprc->left+1,lprc->top+1,12,12,hMemDC,x,0,SRCAND);
		DeleteDC(hMemDC);

		DrawEdge(hDC,lprc,BDR_SUNKENINNER,BF_RECT);
		
		ReleaseDC(m_hWnd,hDC);
			
		SetCapture(m_hWnd);
	}
*/
//	return 0;
//}

//LRESULT RingSizeBar::OnNCMouseMove(RINGPARAMS param)
//{
/*	if(m_ExStyle == TBS_EX_SIZEABLE)
	{
		HDC hDC = GetWindowDC(m_hWnd);
		
		if(param.wParam == HTCLOSE)
		{
			if(m_CurWhere != HTCLOSE)
				DrawEdge(hDC,&m_rcClose,BDR_RAISEDINNER,BF_RECT);

			m_CurWhere = param.wParam;
		}
		else if(param.wParam == HTCAPTION)
			if(m_CurWhere != HTCAPTION)
			{
				m_CurWhere = param.wParam;
				HDC hMemDC = CreateCompatibleDC(hDC);
				SelectObject(hMemDC,m_hbmCtrl);
				BitBlt(hDC,m_rcClose.left,m_rcClose.top,12,12,hMemDC,60,0,SRCCOPY);
				BitBlt(hDC,m_rcClose.left,m_rcClose.top,12,12,hMemDC,0,0,SRCAND);
				DeleteDC(hMemDC);				
			}		
		ReleaseDC(m_hWnd,hDC);		
	}
*/
//	return 0;
//}

//LRESULT RingSizeBar::OnMouseMove(RINGPARAMS param)
//{
/*	if(m_bNCBtDown)
	{
		//因为客户区位置偏移的关系,必须调整鼠标位置
		POINT pt = {param.mousept.x,param.mousept.y};
		
		pt.x += m_rcClient.left;
		pt.y += m_rcClient.top;

		LPRECT lprc;
		int x,x1;
		
		if(m_CurWhere == HTCLOSE)
		{
			lprc = &m_rcClose;
			x = 0;
			x1 = 60;
		}
		else if(m_CurWhere == HTZOOM)
		{
			lprc = &m_rcMinMax;
			x = m_nZoom;
			x1 = 72;
		}
		else
		{
			//拖动矩形框
			return RingDockBar::OnMouseMove(param);
			//return 0;
		}

		HDC hDC = GetWindowDC(m_hWnd);
		HDC hMemDC = CreateCompatibleDC(hDC);
		SelectObject(hMemDC,m_hbmCtrl);

		if(PtInRect(lprc,pt))
		{
			if(m_bNCBtDown != 2)
			{
				m_bNCBtDown = 2;
				BitBlt(hDC,lprc->left,lprc->top,12,12,hMemDC,x1,0,SRCCOPY);
				BitBlt(hDC,lprc->left+1,lprc->top+1,12,12,hMemDC,x,0,SRCAND);
				DrawEdge(hDC,lprc,BDR_SUNKENOUTER,BF_RECT);
			}
		}
		else
		{
			if(m_bNCBtDown != 4)
			{
				m_bNCBtDown = 4;
				BitBlt(hDC,lprc->left,lprc->top,12,12,hMemDC,x1,0,SRCCOPY);
				BitBlt(hDC,lprc->left,lprc->top,12,12,hMemDC,x,0,SRCAND);
				if(m_ExStyle != TBS_EX_NONE)
					DrawEdge(hDC,lprc,BDR_RAISEDINNER,BF_RECT);
			}
		}
		DeleteDC(hMemDC);
		ReleaseDC(m_hWnd,hDC);
	}
*/
//	return 0;
//}

//LRESULT RingSizeBar::OnLButtonUp(RINGPARAMS param)
//{
/*	ReleaseCapture();
	if(m_bNCBtDown == 2)
		if(m_CurWhere == HTCLOSE)
			SendMessage(m_hWnd,WM_SYSCOMMAND,SC_CLOSE,param.lParam);
		else if(m_CurWhere == HTZOOM)
		{
			if(m_nZoom % 24 == 0)
				m_nZoom = RSMAXMIN_ZOOMUP + m_State/2 * 24;
				//SendMessage(m_hWnd,WM_SYSCOMMAND,SC_RESTORE,param.lParam);
			else
				m_nZoom = RSMAXMIN_ZOOMDOWN + m_State/2 * 24;
				//SendMessage(m_hWnd,WM_SYSCOMMAND,SC_MAXIMIZE,param.lParam);
			SetPos(m_winpos.x,m_winpos.y,m_winpos.cx,m_winpos.cy);
		}
		else
			RingDockBar::OnLButtonUp(param);
			//if(m_dragger.IsDragging())
			//	m_dragger.StopDrag(m_hWnd,param.mousept.x,param.mousept.y);
	
	m_bNCBtDown = 0;
*/
//	return 0;
//}

//LRESULT RingSizeBar::OnNCHitTest(RINGPARAMS param)
//{
	//因为客户区位置偏移的关系,必须调整鼠标位置
/*	POINT pt = {param.mousept.x,param.mousept.y};
	ScreenToClient(m_pSite->Handle(),&pt);
	pt.x -= m_winpos.x;
	pt.y -= m_winpos.y;
	
	if(m_State == TBS_FLAG_FLY)
		return HTCLIENT;
	if(PtInRect(&m_rcClose,pt))
		return HTCLOSE;
	if(PtInRect(&m_rcCaption,pt))
		if(m_ExStyle != TBS_EX_NONE && PtInRect(&m_rcMinMax,pt))
			return HTZOOM;
		else
			return HTCAPTION;
	//"标题栏"内的情况判断完毕
	//RECT rc;
	//::GetClientRect(m_hWnd,&rc);
	//InflateRect(&rc,-3,-3);
	if(PtInRect(&m_rcClient,pt))
		return HTCLIENT;
	else
		return HTCAPTION;
*/
//	return 0;
//}